/**
 * 服务器地址检测工具
 * 自动检测真实的后端服务器地址
 */

// 候选服务器地址
const getCandidateServers = (): string[] => {
  const hostname = window.location.hostname
  const protocol = window.location.protocol
  
  const candidates: string[] = []
  
  // 1. 当前访问的主机名（最常见情况）
  candidates.push(`${protocol}//${hostname}:8000`)
  
  // 2. 如果是通过端口映射访问，尝试一些常见的内网地址
  if (hostname.startsWith('192.168.') || hostname.startsWith('172.') || hostname.startsWith('10.')) {
    // 尝试同网段的常见服务器地址
    const parts = hostname.split('.')
    if (parts.length === 4) {
      const baseNetwork = `${parts[0]}.${parts[1]}.${parts[2]}`
      const commonHosts = ['200', '100', '1', '10', '50']
      
      for (const host of commonHosts) {
        if (host !== parts[3]) {
          candidates.push(`${protocol}//${baseNetwork}.${host}:8000`)
        }
      }
    }
  }
  
  // 3. localhost作为备选
  if (hostname !== 'localhost' && hostname !== '127.0.0.1') {
    candidates.push('http://localhost:8000')
  }
  
  return candidates
}

// 测试服务器地址是否可用
const testServerUrl = async (url: string): Promise<boolean> => {
  try {
    const controller = new AbortController()
    const timeoutId = setTimeout(() => controller.abort(), 3000)
    
    const response = await fetch(`${url}/api/`, {
      method: 'GET',
      signal: controller.signal,
      mode: 'cors'
    })
    
    clearTimeout(timeoutId)
    return response.ok
  } catch (error) {
    return false
  }
}

// 检测可用的服务器地址
export const detectServerUrl = async (): Promise<string> => {
  const candidates = getCandidateServers()
  
  console.log('🔍 开始检测服务器地址...', candidates)
  
  // 并行测试所有候选地址
  const testPromises = candidates.map(async (url) => {
    const isAvailable = await testServerUrl(url)
    return { url, isAvailable }
  })
  
  const results = await Promise.all(testPromises)
  
  // 找到第一个可用的地址
  for (const result of results) {
    if (result.isAvailable) {
      console.log('✅ 检测到可用服务器地址:', result.url)
      return result.url
    }
  }
  
  // 如果都不可用，返回默认地址
  const defaultUrl = candidates[0]
  console.warn('⚠️ 未检测到可用服务器，使用默认地址:', defaultUrl)
  return defaultUrl
}

// 缓存检测结果
let cachedServerUrl: string | null = null

export const getServerUrl = async (): Promise<string> => {
  if (!cachedServerUrl) {
    cachedServerUrl = await detectServerUrl()
  }
  return cachedServerUrl
}

// 重新检测（用于手动刷新）
export const refreshServerUrl = async (): Promise<string> => {
  cachedServerUrl = null
  return await getServerUrl()
}
